package com.hunliji.monitor.web.strategy.alert;

import com.alibaba.fastjson.JSON;
import com.hunliji.common.exception.WarnException;
import com.hunliji.monitor.share.enums.AlertActionTypeEnum;
import com.hunliji.monitor.web.strategy.alert.model.AlertActionResultBO;
import com.hunliji.monitor.web.strategy.alert.model.AlertContext;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;

@Slf4j
public abstract class AbstractAlertAction implements
    AlertAction, InitializingBean {

    public static final Logger logger = LoggerFactory.getLogger(AbstractAlertAction.class);

    /**
     * 行动类型
     *
     * @see AlertActionTypeEnum
     * @return 行动类型
     */
    protected abstract AlertActionTypeEnum getAlertActionType();

    /**
     * 单个处理器参数校验
     * @param context 上下文
     */
    protected Boolean validate(AlertContext context) {
        return Boolean.TRUE;
    }

    /**
     * 处理
     *
     * @return
     */
    protected abstract void doProcess(AlertContext context, AlertActionResultBO result) throws Exception;

    @Override
    public AlertActionResultBO doAction(AlertContext context) {
        AlertActionResultBO result = AlertActionResultBO.getDefaultResult();
        try {
            log.info("「{}」告警行动处理器开始执行, 参数: {}",getAlertActionType().getMsg(), JSON.toJSON(context));
            //前置处理
            Boolean validate = baseValidate(context);
            if (!validate) {
                throw new WarnException("参数校验错误！");
            }
            doProcess(context, result);
            return result;
        } catch (Exception e) {
            logger.error("告警行动处理错误", e);
            throw new WarnException("网络异常，请稍后再试~");
        }
    }

    /**
     * 基础参数校验
     * @param context 上下文
     */
    protected Boolean baseValidate(AlertContext context) {
        if (context.getAlertConfigId() == null) {
            logger.info("告警配置id不能为空");
            return Boolean.FALSE;
        }
        if (context.getAliyunAlertNotifyParam() == null) {
            logger.info("阿里云通知参数不能为空");
            return Boolean.FALSE;
        }
        //每个处理器单独校验逻辑
        return validate(context);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        AlertActionContext.setMerchantIndexStrategy(getAlertActionType(), this);
    }
}
